home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Gekkan Dennou Club 147
/
Gekkan Dennou Club - 2000.8 Vol. 147 (Japan).7z
/
Gekkan Dennou Club - 2000.8 Vol. 147 (Japan) (Track 1).bin
/
fdimg
/
—‹Œêsrc.lzh
/
window.c
< prev
next >
Wrap
C/C++ Source or Header
|
1993-02-07
|
7KB
|
303 lines
#include "3DDEF.H"
#include "GLOBAL.H"
#include "FORWARD.H"
#include "XCODE.H"
/* カレントのウインドウを設定する */
void
window_set_current(int number)
{
CWN = number;
CURRENT_TEXT = WDATA[number].WTEXTS;
HEAD = WDATA[number].WHEADS;
TAIL = WDATA[number].WTAILS; /* 頭尾の設定 */
main_set_view_flag();
/* window_change00(number);*/
}
void
window_loc(int x,int y)
{
B_CONSOL(0,YDOT[CWY0+y]+LYW_UPPER,XWIDTH-1,0);
/* B_CONSOL(0,YDOT[CWY0+y],XWIDTH-1,0);*/
B_LOCATE(CWX0+x,0);
}
void
window_abs_loc(int x,int y)
{
/* B_CONSOL(0,YDOT[y]+LYW_UPPER,XWIDTH-1,0);*/
B_CONSOL(0,YDOT[y],XWIDTH-1,0);
B_LOCATE(x,0);
}
/* ウインドウの大きさを設定する */
void
window_set_size(int number,int x0,int y0,int x1,int y1)
{
WDATA[number].WX0 = x0;
WDATA[number].WY0 = y0;
WDATA[number].WX1 = x1;
WDATA[number].WY1 = y1;
}
/* w1 から w2 にコピーする */
void
window_dup_window(int w1,int w2)
{
WDATA[w2] = WDATA[w1];
}
/* ウインドウの大きさを変更する */
void
window_change_size(int number,int x0,int y0,int x1,int y1)
{
if (x0 >= 0) WDATA[number].WX0 = x0;
if (y0 >= 0) WDATA[number].WY0 = y0;
if (x1 >= 0) WDATA[number].WX1 = x1;
if (y1 >= 0) WDATA[number].WY1 = y1;
}
/* ウインドウ内のカーソル位置を設定する */
void
window_set_position(int number,int x,int y,int cpx)
{
WDATA[number].WCX = x;
WDATA[number].WCY = y; /* カーソル位置 */
WDATA[number].WCPX = cpx;
}
/* ウインドウにテキストを割り当てる */
window_set_text(int number,int text_number)
{
WDATA[number].WTEXTS = text_number;
WDATA[number].WHEADS = &TDATA[text_number].TEXT_HEADS;
WDATA[number].WTAILS = &TDATA[text_number].TEXT_TAILS; /* 頭尾の設定 */
}
/* カレントをセーブし、number に変える */
/* テキストが変わる事あり */
/* ボトムの書き換えも行う */
void
window_change(int number)/* ,,, */
{
int cwn0;
cwn0 = CWN; /* 保存 */
window_change0(number);
disp_btm_line(cwn0);
disp_btm_line(CWN); /* CWN == number */
}
/* カレントをセーブし、number に変える */
/* テキストが変わる事あり */
/* ボトムの書き換えは行わない */
void
window_change0(int number)
{
if (number == CWN) {
return;
}
window_change00(number);
}
void
window_change00(int number)
{
UNIT *wp;
int bp,y;
line_seigyou();
#if 0
mark_erase_mark_sys(CWN);/* システムマークを消す,,, */
mark_set_mark(XCODE_SYSMARK-XCODE_MARK+CURRENT_TEXT); /* システムマーク */
#endif
window_set_current(number);
if (wp = mark_get_mark_x(number,XCODE_SYSMARK-XCODE_MARK+number,&bp)) {
/* if (wp = mark_get_mark(XCODE_SYSMARK-XCODE_MARK,&bp)) {*/
#if 0 /* マークが存在した */
mark_erase_mark_sys(number);/* システムマークを消す */
#endif
#if 1
mark_set_mark(XCODE_SYSMARK-XCODE_MARK+CWN); /* システムマーク */
#endif
/* window_set_current(number);*/
/* CWN = number;*/
CL = wp;
line_cl_cl();
if ((y = window_is_this_line_in_current(CL)) < 0) { /* 入ってない */
disp_cl_center();
} else {
CY = y;
}
work_line_analyze();
CPX = work_byte_to_CPX(bp);
CX0 = CX = ANALYZE[CPX].XPOS;
work_cursor_cpx();
} else { /* マークがない */
CL = HEAD->ATO;
line_cl_cl();
CY = CX0 = CX = CPX = 0;
disp_cl_center();
work_line_analyze();
work_cursor_cpx();
}
}
/* カレントをセーブする */
void
window_save()
{
WDATA[CWN].WCX = CX;
WDATA[CWN].WCY = CY;
WDATA[CWN].WCPX = CPX;
WDATA[CWN].WX0 = CWX0;
WDATA[CWN].WY0 = CWY0;
WDATA[CWN].WX1 = CWX1;
WDATA[CWN].WY1 = CWY1;
WDATA[CWN].WTEXTS = CURRENT_TEXT;
WDATA[CWN].WHEADS = HEAD;
WDATA[CWN].WTAILS = TAIL; /* 頭尾の設定 */
window_loc(CX,CY);
line_cl_cl();
}
/* その行がカレントウインドウの中にあるかどうかを調べる */
/* あったなら相対的なY座標、なければ-1を返す */
int
window_is_this_line_in_current(UNIT *up)
{
register int y;
register int rety;
for(rety = 0,y = CWY0;y <= CWY1;y++,rety++) {
if (SCREEN[y] == up) return(rety);
}
return(-1);
}
#if 0
/* その行が w 番ウインドウの中にあるかどうかを調べる */
/* あったなら相対的なY座標、なければ-1を返す */
int
window_is_this_line_in_x(int w,UNIT *up)
{
register int y;
register int rety;
for(rety = 0,y = WDATA[w].WY0;y <= WDATA[w].WY1;y++,rety++) {
if (SCREEN[y] == up) return(rety);
}
return(-1);
}
#endif
/* w のウインドウのシステム */
void
window_check_cursor(int w)
{
int w0;
w0 = CWN;
window_change0(w);
window_change0(w0); /* 戻す */
}
window0()
{
B_CONSOL(0,0,XWIDTH0-1,YWIDTH0-1);
}
int
window_get_free_window_number()
{
register int i;
for(i = 0;i < MAX_WINDOW;i++) {
if (WDATA[i].WX0 < 0) { /* 無効なのを見付けた */
return(i);
}
}
return(-1); /* 無い */
}
int
window_get_free_text_number()
{
register int i;
for(i = 0;i < MAX_TEXT;i++) {
if (TDATA[i].TEXT_FILE < 0) { /* 無効なのを見付けた */
return(i);
}
}
return(-1); /* 無い */
}
/* list の中にフラグをセットして返す */
/* 指定のテキスト番号を扱っているウインドウ番号を返す */
/* リターンバリューはウィンドウの個数 */
int
window_which_has_text_number(int t,STR list)
{
register int i,s=0;
for(i=0;i<MAX_WINDOW;i++) {
s += (list[i] = (WDATA[i].WTEXTS == t));
}
return(s);
}
/* w1 = 上のウインドウ、w2 = 下のウインドウ */
/* w1 の行数が delta だけ変わる */
/* delta はマイナス可 */
/* 実現出来たら1を返す */
int
window_2_change_size(int w1,int w2,int delta)
{
int dw1,dw2;
int y11,y02;
UNIT *wp;
dw1 = (y11 = WDATA[w1].WY1) - WDATA[w1].WY0 + 1; /* 上のウインドウの幅 */
dw2 = WDATA[w2].WY1 - (y02 = WDATA[w2].WY0) + 1; /* 下のウインドウの幅 */
if (((dw1 += delta) > 0) && ((dw2 -= delta) > 0)) {
line_seigyou();
/* 必要な行数だけやりとりできる */
wp = line_x_screen(w2,0); /* 下の一番上の行 */
window_change_size(w1,-1,-1,-1,y11+delta); /* 上の大きさ */
window_change_size(w2,-1,y02+delta,-1,-1); /* 下の大きさ */
if (delta > 0) { /* 上が大きくなる */
disp_window_top_flush(w1,line_x_screen(w1,0));
/* 下が小さくなるので、カーソルが隠れる可能性あり */
if (w2 != CWN) {
window_check_cursor(w2);
} else {
window_change0(w1);
window_change(w2); /* 戻す */
}
} else { /* 下が大きくなる */
wp = line_trace(wp,delta,(int *) NULL);
disp_window_top_flush(w2,wp);
disp_btm_line(w1);
/* 上が小さくなるので、カーソルが隠れる可能性あり */
if (w1 != CWN) {
window_check_cursor(w1);
} else {
window_change0(w2);
window_change(w1); /* 戻す */
}
}
return(1);
} else {
return(0);
}
}